package com.cazor.dg.service.impl;

import java.util.List;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cazor.common.utils.DateUtils;
import javax.annotation.Resource;

import com.cazor.dg.app.AppReqService;
import org.springframework.stereotype.Service;
import com.cazor.dg.mapper.AdgLoginTokenHisMapper;
import com.cazor.dg.domain.AdgLoginTokenHis;
import com.cazor.dg.service.IAdgLoginTokenHisService;

/**
 * 地灾鉴权登录历史Service业务层处理
 *
 * @author cazor
 * @date 2023-11-23
 */
@Service
public class AdgLoginTokenHisServiceImpl extends ServiceImpl<AdgLoginTokenHisMapper, AdgLoginTokenHis> implements IAdgLoginTokenHisService
{
    @Resource
    private AdgLoginTokenHisMapper adgLoginTokenHisMapper;
    @Resource
    private AppReqService appReqService;

    /**
     * 查询地灾鉴权登录历史
     *
     * @param id 地灾鉴权登录历史主键
     * @return 地灾鉴权登录历史
     */
    @Override
    public AdgLoginTokenHis selectAdgLoginTokenHisById(Long id)
    {
        return adgLoginTokenHisMapper.selectAdgLoginTokenHisById(id);
    }

    /**
     * 查询地灾鉴权登录历史列表
     *
     * @param adgLoginTokenHis 地灾鉴权登录历史
     * @return 地灾鉴权登录历史
     */
    @Override
    public List<AdgLoginTokenHis> selectAdgLoginTokenHisList(AdgLoginTokenHis adgLoginTokenHis)
    {
        return adgLoginTokenHisMapper.selectAdgLoginTokenHisList(adgLoginTokenHis);
    }

    /**
     * 新增地灾鉴权登录历史
     *
     * @param adgLoginTokenHis 地灾鉴权登录历史
     * @return 结果
     */
    @Override
    public int insertAdgLoginTokenHis(AdgLoginTokenHis adgLoginTokenHis)
    {
        adgLoginTokenHis.setCreateTime(DateUtils.getNowDate());
        return adgLoginTokenHisMapper.insertAdgLoginTokenHis(adgLoginTokenHis);
    }

    /**
     * 修改地灾鉴权登录历史
     *
     * @param adgLoginTokenHis 地灾鉴权登录历史
     * @return 结果
     */
    @Override
    public int updateAdgLoginTokenHis(AdgLoginTokenHis adgLoginTokenHis)
    {
        adgLoginTokenHis.setUpdateTime(DateUtils.getNowDate());
        return adgLoginTokenHisMapper.updateAdgLoginTokenHis(adgLoginTokenHis);
    }

    /**
     * 批量删除地灾鉴权登录历史
     *
     * @param ids 需要删除的地灾鉴权登录历史主键
     * @return 结果
     */
    @Override
    public int deleteAdgLoginTokenHisByIds(Long[] ids)
    {
        return adgLoginTokenHisMapper.deleteAdgLoginTokenHisByIds(ids);
    }

    /**
     * 删除地灾鉴权登录历史信息
     *
     * @param id 地灾鉴权登录历史主键
     * @return 结果
     */
    @Override
    public int deleteAdgLoginTokenHisById(Long id)
    {
        return adgLoginTokenHisMapper.deleteAdgLoginTokenHisById(id);
    }

    /**
     *  获取最近时间最近一条
     * @param minutes 最近多少分钟 / 如果minutes==0 则默认取前30分钟的
     * @return 最近的一条数据
     */
    public AdgLoginTokenHis getLastLoginTokenHis(int minutes) {
        if (minutes == 0) {
            minutes = appReqService.getTokenEffectiveMinutes();
        }
        Long ts = DateUtil.offsetMinute(DateTime.now(), -minutes).getTime();
        AdgLoginTokenHis his = this.lambdaQuery()
                .ge(AdgLoginTokenHis::getTimes, ts).eq(AdgLoginTokenHis::getSuccess, "1")
                .eq(AdgLoginTokenHis::getCode, 200).isNotNull(AdgLoginTokenHis::getToken)
                .orderByDesc(AdgLoginTokenHis::getToken).last("limit 1").one();
        if (his == null) {
            JSONObject respJson = appReqService.dLogin();
            long times = respJson.getLong("timestamp");

            his = AdgLoginTokenHis.builder()
                    .code(respJson.getInteger("code"))
                    .message(respJson.getString("message"))
                    .success(respJson.getBoolean("success")?"1":"0")
                    .times(times)
                    .build();
            his.setCreateBy("sys");
            his.setCreateTime(DateTime.of(times));
            his.setUpdateTime(DateTime.now());
            if (respJson.getBoolean("success")) {
                JSONObject result = respJson.getJSONObject("result");
                his.setToken(result.getString("token"));
            }
            this.save(his);
        }
        return  his;
    }
}
